﻿using System; 
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using ADV_Evaluator;
using ADV_Evaluator.Data;
using ADV_Evaluator.Command;


namespace ADV_Editor.CommandDialog {

    /// <summary>
    /// 「条件分岐」コマンドのダイアログ
    /// </summary>
    partial class BranchDialog : CommandDialogBase {

        /// <summary>
        /// 空の状態からはじめるコンストラクタ
        /// </summary>
        public BranchDialog() {
            InitializeComponent();
            comboBox_Operator.SelectedIndex = 0;
        }

        /// <summary>
        /// 初期値を設定した状態ではじめるコンストラクタ
        /// </summary>
        /// <param name="param">属性</param>
        public BranchDialog(BranchParams param) : this() {
            textBox_VariableName.Text = param.VariableName;
            comboBox_Operator.SelectedItem = param.Operator;
            numericUpDown_Value.Value = param.Value;
            checkBox_ElseEnabled.Checked = param.HasElse;
        }

        /// <summary>
        /// 変数名の値が変わったとき
        /// </summary>
        private void textBox_VariableName_TextChanged(object sender, EventArgs e) {
            button_OK.Enabled = (textBox_VariableName.Text.Length > 0 && Regex.IsMatch(textBox_VariableName.Text, @"^[^0-9\s\,\.\/\<\>\?\;\:\]\+\*\}\@\[\`\{\-\^\\\!\\""\#\$\%\&\'\(\)\=\~\|]\w*", RegexOptions.Compiled));
        }

        /// <summary>
        /// 変数名のテキストボックスに文字が入力されるとき
        /// </summary>
        private void textBox_VariableName_KeyPress(object sender, KeyPressEventArgs e) {
            // 空白文字とか記号文字は不可
            foreach (char c in Const.InvalidVariableChars) {
                if (e.KeyChar == c) {
                    e.Handled = true;
                    break;
                }
            }
        }

        /// <summary>
        /// 入力された値をコマンド化したもの
        /// </summary>
        public override CommandListData Command {
            get {
                BranchParams param = new BranchParams();
                param.VariableName = textBox_VariableName.Text;
                param.Operator = comboBox_Operator.SelectedItem as string;
                param.Value = (int)numericUpDown_Value.Value;
                param.HasElse = checkBox_ElseEnabled.Checked;
                return new CommandListData(CommandName.条件分岐, param); 
            }
        }

        #region ヘルプ
        /// <summary>
        /// OKボタンのヘルプ
        /// </summary>
        private void button_OK_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "このダイアログを閉じて、コマンドを追加します。");
        }
        /// <summary>
        /// キャンセルボタンのヘルプ
        /// </summary>
        private void button_Cancel_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "変更内容を保存せずにこのダイアログを閉じます。");
        }
        /// <summary>
        /// 変数名のヘルプ
        /// </summary>
        private void textBox_VariableName_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "比較する変数名を入力します。\n未定義の変数の場合は0と看做されます。");
        }
        /// <summary>
        /// 関係演算子のヘルプ
        /// </summary>
        private void comboBox_Operator_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "比較する変数と値の関係をあらわす演算子を指定します。");
        }
        /// <summary>
        /// 比較する値のヘルプ
        /// </summary>
        private void numericUpDown_Value_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "変数と比較する値を入力します。");
        }
        /// <summary>
        /// 条件に当てはまらないときのチェックボックスのヘルプ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="hlpevent"></param>
        private void checkBox_ElseEnabled_HelpRequested(object sender, HelpEventArgs hlpevent) {
            ShowPopupHelp(sender, "上で指定した条件を満たさなかったときの処理を記述するときはチェックを入れます。");
        }
        #endregion

    }
}